package com.zxx.pattern.proxyPattern.daili.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 代理工厂需要实现InvocationHanlder接口并实现其invoke()方法。
 *
 * @author zxx on 2020/9/9
 */
public class SellProxyFactory implements InvocationHandler {

    //代理的真实对象
    private Object realObject;

    public SellProxyFactory(Object realObject) {
        this.realObject = realObject;
    }

    /**
     * @param proxy  代理对象
     * @param method 真正执行的方法
     * @param args   调用第二个参数 method 时传入的参数列表值
     *
     * invoke() 方法是一个代理方法，也就是说最后客户端请求代理时，执行的就是该方法。
     *               代理工厂类到这里为止已经结束了，接下来看第二点：如何通过代理工厂动态生成代理对象。
     *
     * 生成代理对象需要用到Proxy类，它可以帮助我们生成任意一个代理对象，里面提供一个静态方法newProxyInstance。
     *               实例化代理对象时，需要传入3个参数：
     * ClassLoader loader：加载动态代理类的类加载器
     * Class<?>[] interfaces：代理类实现的接口，可以传入多个接口
     * InvocationHandler h：指定代理类的调用处理程序，即调用接口中的方法时，会找到该代理工厂h，执行invoke()方法
     *
     *
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        doSomethingBefore();

        Object obj = method.invoke(realObject, args);

        doSomethingAfter();

        return obj;
    }


    private void doSomethingAfter() {
        System.out.println("执行代理后的额外操作...");
    }

    private void doSomethingBefore() {
        System.out.println("执行代理前的额外操作...");
    }


}
